package capaPresentacion.client;

import capaPresentacion.client.evento.EventoLogout;
import capaPresentacion.client.evento.EventoLogueoAdministrador;
import capaPresentacion.client.evento.EventoLogueoUsuario;
import capaPresentacion.client.evento.ManejadorEventoLogout;
import capaPresentacion.client.evento.ManejadorEventoLogueoAdministrador;
import capaPresentacion.client.evento.ManejadorEventoLogueoUsuario;
import capaPresentacion.client.presentador.Presentador;
import capaPresentacion.client.presentador.PresentadorAdministrador;
import capaPresentacion.client.presentador.PresentadorLogueo;
import capaPresentacion.client.presentador.PresentadorUsuario;
import capaPresentacion.client.vista.VistaAdministrador;
import capaPresentacion.client.vista.VistaLogueo;
import capaPresentacion.client.vista.VistaUsuario;

import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HasWidgets;

public class AppController implements Presentador, ValueChangeHandler<String> {

	private final HandlerManager eventBus;
	private final WorldsTrainerWebServiceAsync rpcService;
	private HasWidgets container;

	public AppController(WorldsTrainerWebServiceAsync rpcService,
			HandlerManager eventBus) {
		this.eventBus = eventBus;
		this.rpcService = rpcService;
		bind();
	}

	private void bind() {
		History.addValueChangeHandler(this);
		eventBus.addHandler(EventoLogueoUsuario.TYPE,
				new ManejadorEventoLogueoUsuario() {
					public void onLogueoUsuario(EventoLogueoUsuario event) {
						doLogueoUsuario();
					}
				});
		eventBus.addHandler(EventoLogueoAdministrador.TYPE,
				new ManejadorEventoLogueoAdministrador() {
					@Override
					public void onLogueoAdministrador(
							EventoLogueoAdministrador event) {
						doLogueoAdministrador();
					}
				});
		eventBus.addHandler(EventoLogout.TYPE, new ManejadorEventoLogout() {
			@Override
			public void onLogout(EventoLogout event) {
				doLogout();
			}
		});
	}

	protected void doLogueoAdministrador() {
		History.newItem("administradorLogueado");
	}

	protected void doLogueoUsuario() {
		History.newItem("usuarioLogueado");
	}

	protected void doLogout() {
		History.newItem("logout");
	}

	public void go(HasWidgets container) {
		this.container = container;
		if ("".equals(History.getToken()))
			History.newItem("logeo");
		else
			History.fireCurrentHistoryState();
	}

	@Override
	public void onValueChange(ValueChangeEvent<String> event) {
		String token = event.getValue();
		if (token != null) {
			Presentador presentador = null;
			if (token.equals("logeo")) {
				presentador = new PresentadorLogueo(rpcService, eventBus,
						new VistaLogueo());
			} else if (token.equals("usuarioLogueado")) {
				presentador = new PresentadorUsuario(rpcService, eventBus,
						new VistaUsuario());
			} else if (token.equals("logout")) {
				presentador = new PresentadorLogueo(rpcService, eventBus,
						new VistaLogueo());
			} else if (token.equals("administradorLogueado")) {
				presentador = new PresentadorAdministrador(rpcService,
						eventBus, new VistaAdministrador());
			}
			if (presentador != null)
				presentador.go(container);
		}
	}
}
